﻿using CLM.Gestao.Interfaces;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;

namespace CLM.Gestao.Administrador.UI
{
    public partial class ContasContabeis : Form, IFormulario
    {
        #region Propriedades e Variáveis

        BLL.ContaContabil ContaContabil = new BLL.ContaContabil();

        //Lista para armazenar os objetos apresentados na interface
        List<BLL.ContaContabil.Lista> ListaContasContabeis;

        //Objeto utilizado para armazenas os valores novos ou de alteração de um registro
        BLL.ContaContabil.Lista ContaContabilSelecionado = null;

        //Objeto utilizado para filtros
        BLL.ContaContabil.Lista ContaContabilFiltro = null;

        //Objeto para controle do Estado da interface
        Util.Estado Estado = Util.Estado.Nenhum;

        #endregion

        #region Construtor

        public ContasContabeis()
        {
            try
            {
                InitializeComponent();

                var pos = this.PointToScreen(lblTitulo.Location);
                pos = picTitulo.PointToClient(pos);
                lblTitulo.Parent = picTitulo;
                lblTitulo.Location = pos;
                lblTitulo.BackColor = Color.Transparent;

                InicializaGrid();
                InicializaCombos();
                ConfiguraInterface(Util.Estado.Nenhum);
                Limpar();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        #endregion Contrutor

        #region Eventos

        private void btnBuscar_Click(object sender, EventArgs e)
        {
            try
            {
                Buscar();
                ConfiguraInterface(Util.Estado.Consulta);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        private void btnIncluir_Click(object sender, EventArgs e)
        {
            try
            {
                ContaContabilSelecionado = new BLL.ContaContabil.Lista();
                ConfiguraInterface(Util.Estado.Inclusao);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        private void btnSalvar_Click(object sender, EventArgs e)
        {
            try
            {
                ValidarInterface();
                AtualizaObjeto();
                Salvar();

                if (dgvContasContabeis.DataSource == null)
                    CarregaObjetoFiltro();

                Cancelar();
                Buscar();

                ConfiguraInterface(Util.Estado.Nenhum);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        private void btnCancelar_Click(object sender, EventArgs e)
        {
            try
            {
                Cancelar();
                ConfiguraInterface(Util.Estado.Nenhum);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        private void btnExcluir_Click(object sender, EventArgs e)
        {
            try
            {
                if (MessageBox.Show("Tem certeza que deseja excluir a conta contábil?", "Atenção", MessageBoxButtons.YesNo) == System.Windows.Forms.DialogResult.Yes)
                {
                    Excluir();
                    Cancelar();
                    Buscar();

                    ConfiguraInterface(Util.Estado.Nenhum);
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        private void btnLimpar_Click(object sender, EventArgs e)
        {
            try
            {
                Limpar();
                ConfiguraInterface(Util.Estado.Nenhum);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        private void btnExportar_Click(object sender, EventArgs e)
        {
            try
            {
                Exportar();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        private void dgvContasContabeis_DoubleClick(object sender, EventArgs e)
        {
            try
            {
                ContaContabilSelecionado = ListaContasContabeis[dgvContasContabeis.SelectedRows[0].Index];
                AtualizaInterface();
                ConfiguraInterface(Util.Estado.Alteracao);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        #endregion Eventos

        #region Metodos Publicos

        public void CarregaObjetoFiltro()
        {
            ContaContabilFiltro = new BLL.ContaContabil.Lista();
            if (!string.IsNullOrWhiteSpace(txtCodigoContaContabil.Text)) ContaContabilFiltro.CodigoContaContabil = txtCodigoContaContabil.Text;
            if (!string.IsNullOrWhiteSpace(txtNomeContaContabil.Text)) ContaContabilFiltro.DescricaoContaContabil = txtNomeContaContabil.Text;
            if (cboCategoria.SelectedIndex > -1) ContaContabilFiltro.IdCategoria = ((BLL.Categoria.Itens)cboCategoria.SelectedItem).IdCategoria;
        }

        public void InicializaCombos()
        {
            // Carrega o combo de Categoria
            BLL.Categoria Categoria = new BLL.Categoria();
            cboCategoria.DataSource = Categoria.GetItens();
            cboCategoria.DisplayMember = "NomeCategoria";
            cboCategoria.ValueMember = "IdCategoria";
        }

        public void InicializaGrid()
        {
            dgvContasContabeis.AutoGenerateColumns = false;
            dgvContasContabeis.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
            dgvContasContabeis.Columns.Add(new DataGridViewColumn() { DataPropertyName = "CodigoContaContabil", HeaderText = "Código", CellTemplate = new DataGridViewTextBoxCell(), MinimumWidth = 50 });
            dgvContasContabeis.Columns.Add(new DataGridViewColumn() { DataPropertyName = "DescricaoContaContabil", HeaderText = "Nome", CellTemplate = new DataGridViewTextBoxCell(), MinimumWidth = 150 });
            dgvContasContabeis.Columns.Add(new DataGridViewColumn() { DataPropertyName = "NomeCategoria", HeaderText = "Categoria", CellTemplate = new DataGridViewTextBoxCell(), MinimumWidth = 50 });
        }

        public void ValidarInterface()
        {
            if (string.IsNullOrWhiteSpace(txtCodigoContaContabil.Text)) throw new Exception("O código é obrigatório.");
            if (string.IsNullOrWhiteSpace(txtNomeContaContabil.Text)) throw new Exception("O nome é obrigatório.");
            if (cboCategoria.SelectedIndex < 0) throw new Exception("Selecione a categoria.");
        }

        public void AtualizaObjeto()
        {
            ContaContabilSelecionado.CodigoContaContabil = txtCodigoContaContabil.Text;
            ContaContabilSelecionado.DescricaoContaContabil = txtNomeContaContabil.Text;
            ContaContabilSelecionado.IdCategoria = ((BLL.Categoria.Itens)cboCategoria.SelectedItem).IdCategoria;
            ContaContabilSelecionado.NomeCategoria = ((BLL.Categoria.Itens)cboCategoria.SelectedItem).NomeCategoria;
        }

        public void AtualizaInterface()
        {
            if (txtCodigoContaContabil.Text != null)
                txtCodigoContaContabil.Text = ContaContabilSelecionado.CodigoContaContabil;

            if (txtNomeContaContabil.Text != null)
                txtNomeContaContabil.Text = ContaContabilSelecionado.DescricaoContaContabil;

            if (ContaContabilSelecionado.IdCategoria != null)
                cboCategoria.SelectedValue = ContaContabilSelecionado.IdCategoria;
            else
                cboCategoria.SelectedValue = -1;
        }

        public void Incluir()
        {
            ContaContabil.Add(new List<BLL.ContaContabil.Lista>() { ContaContabilSelecionado });
            MessageBox.Show("Conta contábil cadastrada com sucesso.");
        }

        public void Alterar()
        {
            ContaContabil.Update(new List<BLL.ContaContabil.Lista>() { ContaContabilSelecionado });
            MessageBox.Show("Conta contábil alterada com sucesso.");
        }

        public void Excluir()
        {
            ContaContabil.Delete(new List<BLL.ContaContabil.Lista>() { ContaContabilSelecionado });
            MessageBox.Show("Conta contábil excluída com sucesso.");
        }

        public void Cancelar()
        {
            txtCodigoContaContabil.Text = string.Empty;
            txtNomeContaContabil.Text = string.Empty;
            cboCategoria.SelectedIndex = -1;
        }

        public void Salvar()
        {
            switch (Estado)
            {
                case Util.Estado.Nenhum:
                    break;
                case Util.Estado.Inclusao:
                    Incluir();
                    break;
                case Util.Estado.Alteracao:
                    Alterar();
                    break;
                default:
                    break;
            }
        }

        public void Limpar()
        {
            Cancelar();
            ContaContabilFiltro = null;
            dgvContasContabeis.DataSource = null;
        }

        public void Buscar()
        {
            if (ContaContabilFiltro == null) CarregaObjetoFiltro();
            ListaContasContabeis = ContaContabil.GetLista(ContaContabilFiltro);
            dgvContasContabeis.DataSource = ListaContasContabeis;
        }

        public void Exportar()
        {
            string FileName = string.Empty;

            SaveFileDialog sfdExportar = new SaveFileDialog();
            sfdExportar.Filter = "Arquivo Excel 2007-2010|*.xlsx|Arquivo Excel 97-2003|*.xls";
            sfdExportar.Title = "Salvar Arquivo";
            sfdExportar.FileName = "";
            if (sfdExportar.ShowDialog() == DialogResult.OK)
            {
                FileName = sfdExportar.FileNames[0];

                string[] Cabecalho = { "Código", "Nome", "Categoria" };
                List<string> ListaCampos = new List<string> { "CodigoContaContabil", "DescricaoContaContabil", "NomeCategoria" };

                Exportacao.Excel<BLL.ContaContabil.Lista>.TipoExportacao = Exportacao.TipoExportacao.Exportacao;
                Exportacao.Excel<BLL.ContaContabil.Lista>.Exportar(ListaContasContabeis, ListaCampos, Cabecalho, FileName, "Contas Contábeis");
            }
        }

        public void ConfiguraInterface(Util.Estado pEstado)
        {
            Estado = pEstado;

            if (pEstado == Util.Estado.Inclusao)
                dgvContasContabeis.ClearSelection();

            //btnIncluir.Enabled = (Estado == Util.Estado.Nenhum ||
            //                     Estado == Util.Estado.Consulta) ? true : false;

            btnSalvar.Enabled = (Estado == Util.Estado.Alteracao ||
                                 Estado == Util.Estado.Inclusao) ? true : false;

            btnCancelar.Enabled = (Estado == Util.Estado.Alteracao ||
                                 Estado == Util.Estado.Inclusao) ? true : false;

            //btnExcluir.Enabled = (Estado == Util.Estado.Alteracao) ? true : false;

            btnBuscar.Enabled = (Estado == Util.Estado.Nenhum ||
                                 Estado == Util.Estado.Consulta) ? true : false;

            btnLimpar.Enabled = (dgvContasContabeis.DataSource != null) ? true : false;

            btnExportar.Enabled = (dgvContasContabeis.DataSource != null) ? true : false;

            dgvContasContabeis.Enabled = (Estado == Util.Estado.Consulta ||
                                 (Estado == Util.Estado.Nenhum && dgvContasContabeis.DataSource != null)) ? true : false;
        }
        #endregion Metodos Publicos

        private void ContasContabeis_Load(object sender, EventArgs e)
        {

        }
    }
}